package com.songyang.serialize.inter;

import com.songyang.common.YoungSQLException;
import com.songyang.transport.YoungSQLDataPackage;
import com.songyang.utils.ByteUtils;

import java.util.Arrays;

public interface YoungSqlSerialize {
    /**
     * kryo的序列化器
     */
    int KRYO_SERIALIZE = 1;
    /**
     * 内置的序列化器
     */
    int YOUNG_SERIALIZE = 2;
    /**
     * 标志位的偏移量（1为失败，0为成功）
     */
    int FLAG_OFFSET = 0;
    /**
     * 标志位占的字节长度
     */
    int FLAG_LEN = 1;
    /**
     * 编解码器长度
     */
    int DECODER_LEN = 2;
    /**
     * 选择使用的编解码器偏移量
     */
    int DECODER_OFFSET = FLAG_OFFSET + FLAG_LEN;

    /**
     * 数据域的长度
     */
    int DATA_OFFSET = DECODER_OFFSET + DECODER_LEN;

    /**
     * 返回数组的编解码器的格式
     *
     * @param raw 原始数据
     * @return 编解码器
     */
    static short getDecoderType(byte[] raw) {
        return ByteUtils.DecoderByte2Type(Arrays.copyOfRange(raw, DECODER_OFFSET, DECODER_LEN));
    }

    /**
     * 判断数据是否是错误数据
     *
     * @param raw 原始数据
     * @return 结果
     */
    static boolean dataIsError(byte[] raw) {
        return raw[FLAG_OFFSET] == 1;
    }

    byte[] serialize(YoungSQLDataPackage p) throws YoungSQLException;

    YoungSQLDataPackage deserialize(byte[] bytes) throws YoungSQLException;
}
